#pragma once

#include <iostream>
#include <memory>
#include <unordered_map>
#include "Epoller.hpp"
#include "Listener.hpp"
#include "Connection.hpp"

class TcpServer
{
public:
    TcpServer(): _epoller_ptr(std::make_unique<Epoller>())
    {

    }

    void Start()
    {
        while(true)
        {
            _epoller_ptr->Wait();
        }
    }

    //该接口要把所有的新连接添加到_connections，并且写透到epoll内核中！
    void AddConnecton(std::shared_ptr<Connection>& conn)
    {
        //1. conn对应的fd和他要关心的事件，写透到内核中！
        uint32_t events = conn->GetEvent();
        int sockfd = conn->GetFd();
        _epoller_ptr->AddEvent(sockfd, events);

        //2. 将具体的connection添加到_connections
        _connections[sockfd] = conn;
    }

    ~TcpServer()
    {

    }

private:
    //1.epoll模型
    std::unique_ptr<Epoller> _epoller_ptr;

    //2.管理所有的connecton, 本质是管理未来获取到的所有fd
    //fd : connection
    std::unordered_map<int, std::shared_ptr<Connection>> _connections;
};